/*
Copyright (c) [2019年5月1日] [吴超]
[MBT_Studio] is licensed under Mulan PSL v2.
You can use this software according to the terms and conditions of the Mulan PSL v2.
You may obtain a copy of Mulan PSL v2 at:
		 http://license.coscl.org.cn/MulanPSL2
THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
See the Mulan PSL v2 for more details.
*/
#include "stdafx.h"
#include "场景信息.h"
#include "节点/节点树.h"

#include <节点/插座/通用插座.h>
#include <节点/插座/C_物体插座.h>
#include <节点/插座/C_单值矢量插座.h>
#include <节点/插座/C_数值插座.h>
#include <节点/插座/list/list矢量插座.h>

#include "Context/当前默认操作数据.h"


#include <Context/当前默认操作数据.h>
#include <Context/数据创建销毁.h>



/*vec3 C_视口物体操作手柄节点::g相机位置 = {};
vec3 C_视口物体操作手柄节点::g开始射线 = {};
vec3 C_视口物体操作手柄节点::g结束射线 = {};
vec3 C_视口物体操作手柄节点::g手柄位置 = {};
vec3 C_视口物体操作手柄节点::g垂足坐标 = {};
vec3 C_视口物体操作手柄节点::g垂直线向量 = {};
vec3 C_视口物体操作手柄节点::g交点S = {};
vec3 C_视口物体操作手柄节点::g交点E = {};
float32 C_视口物体操作手柄节点::g垂直线长度 = 0;
float32 C_视口物体操作手柄节点::g开始交点距离 = 0;
float32 C_视口物体操作手柄节点::g结束交点距离 = 0;*/

S_射线拾取参数 C_视口物体操作手柄节点::pickInfo = {};





C_帧时间节点::C_帧时间节点(S_设备环境& ctx) : C_节点基类("帧时间节点") {
	m_Name = L"帧时间";
	m_Ctx = ctx;

	m_更新方式 = E_节点更新方式::e_节点更新_逐帧;


	C_插座基类* socket;
	DEF_创建F32插座_v1_O(L"当前时间");
	DEF_创建F32插座_v1_O(L"开始");
	DEF_创建F32插座_v1_O(L"结束");

}

C_帧时间节点::~C_帧时间节点() {

}

bool C_帧时间节点::f_update() {
	auto& 当前时间 = DEF_F32插座数据(f_get输出插座(1));
	auto& 开始 = DEF_F32插座数据(f_get输出插座(2));
	auto& 结束 = DEF_F32插座数据(f_get输出插座(3));
	
	auto frame = f_NodeCtx_get帧();
	当前时间 = f_prop_I32(frame.当前帧);
	开始 = f_prop_iVec2(frame.帧区间).x;
	结束 = f_prop_iVec2(frame.帧区间).y;

	f_set是否要更新(true);
	return false;
}

std::string C_帧时间节点::DEF_节点编译函数 {
	m_ReleaseCode = "";
	m_Code = "";
	std::string name = f_getName();
	auto* rt = f_getThis节点树();

	auto frame = f_NodeCtx_get帧();
	m_Code += "int32 " + name + "_当前帧 = " + f_代码构建_属性变量(frame.当前帧, rt) + ";\n";
	//m_Code += "int32 " + name + "_当前帧 = " + f_代码构建_属性变量(frame.帧区间, rt) + ";\n";
	m_Code += f_get输出插座(2)->f_构建变量代码(0);
	m_Code += f_get输出插座(3)->f_构建变量代码(0);

	m_Code += m_ReleaseCode;

	f_get输出插座(1)->f_setCode(name + "_当前帧");
	f_get输出插座(2)->f_setCode(f_get输出插座(2)->f_getCode(0));
	f_get输出插座(3)->f_setCode(f_get输出插座(3)->f_getCode(0));
	if (m_区域父节点) {
		(*m_区域父节点).m_Code += m_Code;
		return "";
	}
	return m_Code;
}

C_节点基类* f_node_创建帧时间节点(S_设备环境& ctx, C_节点树* 子节点树) {
	return new C_帧时间节点(ctx);
}

C_节点基类* f_node_载入帧时间节点(S_设备环境& ctx, FILE* f) {
	C_帧时间节点* node = new C_帧时间节点(ctx);
	return node;
}

void f_node_保存帧时间节点(C_节点基类* n, FILE* f) {
	C_帧时间节点* node = dynamic_cast<C_帧时间节点*>(n);
}







C_视口物体操作手柄节点::C_视口物体操作手柄节点(S_设备环境& ctx) : C_节点基类("视口物体操作手柄节点")  {
	m_Name = L"操作手柄";
	m_Ctx = ctx;

	C_插座基类* socket;
	DEF_创建Vec3插座_O(L"开始点");
	DEF_创建Vec3插座_O(L"结束点");

	DEF_创建线段插座_O(L"垂线");
	DEF_创建线段插座_O(L"偏转");

	m_更新方式 = e_节点更新_实时;



	m_Ob = f_node_网格节点创建物体数据(m_Ctx);

	auto* mesh_line = f_surface_创建网格对象(nullptr, m_Ctx, E_网格数据枚举::e_Mesh_VULKAN);
	f_ob_set数据(m_Ob, mesh_line);
	auto* mesh_point = f_surface_创建网格对象(nullptr, m_Ctx, E_网格数据枚举::e_Mesh_VULKAN);
	f_ob_set数据(m_Ob, mesh_point);


	f_ob_set材质(m_Ob, f_NodeCtx_get单色线段材质(), 0);
	f_ob_set材质(m_Ob, f_NodeCtx_get单色点材质(), 1);

	f_NodeCtx_get默认场景()->f_add物体({ m_Ob }, E_场景物体容器类型::e_集合);
}

C_视口物体操作手柄节点::~C_视口物体操作手柄节点() {
	f_NodeCtx_get默认场景()->f_remove物体(m_Ob, E_场景物体容器类型::e_集合);
}

bool C_视口物体操作手柄节点::f_update() {
	
	S_Mesh* mesh = f_ob_fromMesh(m_Ob, 0);
	std::vector<vec3> vnData;
	vnData = { 
		S_射线拾取参数::g相机位置, S_射线拾取参数::g相机位置 - S_射线拾取参数::g开始射线 * S_射线拾取参数::g开始交点距离,
		S_射线拾取参数::g相机位置, S_射线拾取参数::g相机位置 - S_射线拾取参数::g结束射线 * S_射线拾取参数::g结束交点距离,
		S_射线拾取参数::g垂足坐标, S_射线拾取参数::g垂足坐标 - S_射线拾取参数::g垂直线向量 * S_射线拾取参数::g垂直线长度,

		S_射线拾取参数::g相机位置, S_射线拾取参数::g交点S,
		S_射线拾取参数::g相机位置, S_射线拾取参数::g交点E,
	};
	f_surface_fill顶点数据(mesh, vnData);

	return false;
}

C_节点基类* f_node_载入视口物体操作手柄节点(S_设备环境& ctx, FILE* f) {
	C_视口物体操作手柄节点* node = new C_视口物体操作手柄节点(ctx);

	return node;
}

void f_node_保存视口物体操作手柄节点(C_节点基类* n, FILE* f) {
	C_视口物体操作手柄节点* node = dynamic_cast<C_视口物体操作手柄节点*>(n);

}





